package org.andengine.extension.svg.util;

import android.graphics.Color;

import org.andengine.extension.svg.util.SVGNumberParser.SVGNumberParserIntegerResult;
import org.andengine.extension.svg.util.constants.ColorUtils;
import org.andengine.extension.svg.util.constants.ISVGConstants;
import org.xml.sax.Attributes;


/**
 * (c) 2010 Nicolas Gramlich
 * (c) 2011 Zynga Inc.
 *
 * @author Nicolas Gramlich
 * @since 17:43:24 - 22.05.2011
 */
public class SVGParserUtils implements ISVGConstants {
    // ===========================================================
    // Constants
    // ===========================================================

    // ===========================================================
    // Fields
    // ===========================================================

    // ===========================================================
    // Constructors
    // ===========================================================

    // ===========================================================
    // Getter & Setter
    // ===========================================================

    // ===========================================================
    // Methods for/from SuperClass/Interfaces
    // ===========================================================

    // ===========================================================
    // Methods
    // ===========================================================

    public static Float extractFloatAttribute(final String pString) {
        if (pString == null) {
            return null;
        } else {
            try {
                if (pString.endsWith(UNIT_PX)) {
                    return Float.parseFloat(pString.substring(0, pString.length() - 2));
                } else {
                    return Float.parseFloat(pString);
                }
            } catch (final NumberFormatException nfe) {
                return null;
            }
        }
    }

    public static String extractIDFromURLProperty(final String pProperty) {
        return pProperty.substring("url(#".length(), pProperty.length() - 1);
    }

    public static Integer extractColorFromRGBProperty(final String pProperty) {
        final SVGNumberParserIntegerResult svgNumberParserIntegerResult = SVGNumberParser.parseInts(pProperty.substring("rgb(".length(), pProperty.indexOf(')')));
        if (svgNumberParserIntegerResult.getNumberCount() == 3) {
            return Color.argb(0, svgNumberParserIntegerResult.getNumber(0), svgNumberParserIntegerResult.getNumber(1), svgNumberParserIntegerResult.getNumber(2));
        } else {
            return null;
        }
    }

    public static Integer extraColorIntegerProperty(final String pProperty) {
        return Integer.parseInt(pProperty, 16);
    }

    public static Integer extractColorFromHexProperty(final String pProperty) {
        final String hexColorString = pProperty.substring(1).trim();
        if (hexColorString.length() == 3) {
            final int parsedInt = Integer.parseInt(hexColorString, 16);
            final int red = (parsedInt & ColorUtils.COLOR_MASK_12BIT_RGB_R) >> 8;
            final int green = (parsedInt & ColorUtils.COLOR_MASK_12BIT_RGB_G) >> 4;
            final int blue = (parsedInt & ColorUtils.COLOR_MASK_12BIT_RGB_B) >> 0;
            /* Generate color, duplicating the bits, so that i.e.: #F46 gets #FFAA66. */
            return Color.argb(0, (red << 4) | red, (green << 4) | green, (blue << 4) | blue);
        } else if (hexColorString.length() == 6) {
            return Integer.parseInt(hexColorString, 16);
        } else {
            return null;
        }
    }

    public static String parseHref(final Attributes pAttributes) {
        String href = SAXHelper.getStringAttribute(pAttributes, ATTRIBUTE_HREF);
        if (href != null) {
            if (href.startsWith("#")) {
                href = href.substring(1);
            }
        }
        return href;
    }

    // ===========================================================
    // Inner and Anonymous Classes
    // ===========================================================
}
